﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using MDK;
using MDK.Physics;
using ZedGraph;
using Tao.FreeGlut;
using Tao.OpenGl;
using Tao.Platform.Windows;

namespace OpenGLmodule
{
    public class SomePhysicsClass : GraphicPrimitive
    {
        #region Конструкторы
        public SomePhysicsClass()
            : base(0, 0, new Size())
        {
            AddParametersToTemplate();
            this.Needs = ExperimentNeeds.OpenGL;
        }

        public SomePhysicsClass(int Left, int Top, Size Size)
            : base(Left, Top, Size)
        {
            this.Needs = ExperimentNeeds.OpenGL; // нужды

            // передаём размеры
            this.Left = Left;
            this.Top = Top;

            this.Size = Size;

            //создаём список по умолчанию
            AddParametersToTemplate();
        }
        #endregion

        #region Методы взаимодействия с главным модулем
        private void AddParametersToTemplate()
        {
            ParameterListTemplate = new ParameterList();

            ParameterListTemplate.Add("Интенсивность света", "shininessLevel", 30);
        }
        double shininess;
        public override void SetParameters(ParameterList pList)
        {
            // todo: получить параметры из pList во "внутренние" переменные 
            shininess = pList["shininessLevel"];
        }


        public override ParameterList GetParameters()
        {
            ParameterList RetList = ParameterListTemplate;

            //todo: в RetList заносим "внутренние" переменные

            return RetList;
        }

        public override PointPairList GetResults()
        {
            // todo: возвращаем результаты для статистики
            return new PointPairList();
        }

        /// <summary>
        /// Метод рисования
        /// </summary>
        /// <param name="e"></param>
        public override void Draw(System.Windows.Forms.PaintEventArgs e)
        {

            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
            Gl.glDisable(Gl.GL_LIGHTING);// Gl.glDisable(Gl.GL_LIGHT0);
            Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, new float[] { (float)shininess / 100, (float)shininess / 100, (float)shininess / 100 });
            Gl.glEnable(Gl.GL_LIGHTING); //Gl.glEnable(Gl.GL_LIGHT0);
            //Gl.glLoadIdentity();
            Gl.glColor3i(255, 0, 0);

            Gl.glPushMatrix();
                Gl.glColor3i(0, 255, 0);
                //Gl.glTranslated(0, 0, -3);
                //Gl.glRotated(45, 1, 1, 1);
                //Glut.glutSolidSphere(5, 64, 64);
                Glut.glutSolidCube(40);
                //Glut.glutWireSphere(45, 64, 64);
            Gl.glPopMatrix();

            Gl.glPushMatrix();
            Gl.glTranslated(50, 10, 0);
            Glut.glutSolidTeapot(30);
            Gl.glPopMatrix();
            Gl.glFlush();
           
        }

        private void DrawNet()
        {
            Gl.glBegin(Gl.GL_LINES);
            float size = 10f;
            for (int xc = 0; xc < 10; xc++)
            {
                Gl.glVertex3f((float)(-size / 2.0) + xc / (float)(4 * size),
                            0.0f,
                            size / 2.0f);
                Gl.glVertex3f((float)(-size / 2.0) + xc / (float)(4 * size),
                            0.0f,
                            size / -2.0f);
            }
            for (int zc = 0; zc < 10; zc++)
            {
                Gl.glVertex3f(size / 2.0f,
                            0.0f,
                            -size / 2.0f + zc / (float)(10 - 1) * size);
                Gl.glVertex3f(size / -2.0f,
                            0.0f,
                            -size / 2.0f + zc / (float)(10 - 1) * size);
            }
            Gl.glEnd();
            
        }

        public override ExperimentAbout GetAbout()
        {
            return new ExperimentAbout("OpenGLmodule", "Tao.OpenGL test module", "Модуль демонстрирует минимальные возможности Tao.OpenGL");
        }
        #endregion
    }
}
